#pragma once

#include <base/macro/map.h>

/* 加括号和去括号 */
#define __UNMLIST(...) 			__VA_ARGS__
#define MLIST(...)			(__VA_ARGS__)
#define UNMLIST(x)			__UNMLIST x
#define MLIST_CONS(x, ...)		(__UNMLIST x,__VA_ARGS__)
#define MLIST_APPEND(x, ...)		(__UNMLIST x,__UNMLIST __VA_ARGS__)

#define __MLIST_REV(x1, x2)		(x2, __UNMLIST x1)
#define _MLIST_REV(x, ...)		__UNMLIST FOLDL(__MLIST_REV, x, __VA_ARGS__)
#define MLIST_REV(x,...)		EVAL(_MLIST_REV((x), __VA_ARGS__))


/* 取头部和尾部 */
#define MLIST_HD(x)			HD x
/* 取最后一个 */
#define __SND(_, y)			y
/* 一直取第二个 */
#define TL(...)				FOLDL(__SND, __VA_ARGS__)
#define MLIST_TL(x, ...)		TL x

/* 取剩下的 */
#define MLIST_REST(l)			(EXPAND(DEFER(EXC_HD)(__UNMLIST l)))

#define __MLIST_MAP(f, sep, l)		__MAP(f, sep, __UNMLIST x)
#define MLIST_MAP(f, l)			__MLIST_MAP(f, __ETY, l)


/* 用于组合顺序函数的,根据参数生成两两一对的LIST */
#define __GEN_PAIRLIST0(x, y, ...)	MLIST(x, y) __VA_OPT__(, DEFER(__GEN_PAIRLIST1)(y, __VA_ARGS__))
#define __GEN_PAIRLIST1(x, y, ...)	MLIST(x, y) __VA_OPT__(, DEFER(__GEN_PAIRLIST0)(y, __VA_ARGS__))


#define GEN_PAIRLIST(...)		EVAL(__GEN_PAIRLIST0(__VA_ARGS__))

#define __MAP_TOMLIST(x)		MLIST(x)
